AWS ALBでRSA証明書とECDSA証明書の両方に対応する
ども、大瀧です。
先日、ALBに複数のSSL/TLS証明書を設定できるようになりました。設定方法は以下のブログを参照ください。
複数の証明書というと異なるドメイン名をハンドルするバーチャルホストを連想しますが、今回は同じドメイン名で異なる暗号方式の証明書を設定するパターンをご紹介します。
異なる暗号方式の証明書を用意する目的
TLSのサーバー証明書の暗号方式は複数あり、TLS接続の初期段階(TLSハンドシェイク)で利用する証明書が決められます。暗号方式によってサポートするクライアントや計算量が異なるため、古めのクライアント向けの証明書、計算量の少ない新しめな暗号方式の証明書など複数用意することできめ細かいTLS通信が実現できます。
設定方法
今回は、多くのクライアントがサポートするRSAの証明書とちょっと新しめのECDSAの証明書を設定してみます。設定手順は前述のブログ記事と特に変わりませんが、以下のコツがあります。
1. 追加の証明書として設定する
ALBに設定する証明書は、SNI非対応のクライアントに送るためのデフォルト証明書とSNI用の追加の証明書を区別して設定します。デフォルト証明書は1つのみ設定可で、追加の証明書を含めた証明書の選択が行われないため、今回の用途にデフォルト証明書は利用できません。一方でデフォルト証明書と追加の証明書は同じTLS証明書を登録できるので、デフォルト証明書にはRSA証明書とECDSA証明書のどちらかを登録しておけば良いでしょう。以下の様な感じです。
2. クライアントからSNIで接続する
前述の通り今回の用途では追加の証明書にTLS証明書を設定するため、結果的にSNIサポートが必要になります *1openssl s_client
コマンドで動作確認するときには、-servername
オプションでドメイン名を付与しましょう。
動作確認例
suzaku:~ ryuta$ openssl s_client -connect otaki.classmethod.info:443 -cipher ECDHE-RSA-AES128-GCM-SHA256 -servername otaki.classmethod.info < /dev/null CONNECTED(00000003) depth=0 CN = otaki.classmethod.info verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 CN = otaki.classmethod.info verify error:num=21:unable to verify the first certificate verify return:1 --- Certificate chain 0 s:/CN=otaki.classmethod.info i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 --- Server certificate -----BEGIN CERTIFICATE----- MIIFDzCCA/egAwIBAgISBH+JLJcP45AmY2xO4+YHqyskMA0GCSqGSIb3DQEBCwUA MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzEwMTEwMjA5NThaFw0x ODAxMDkwMjA5NThaMCExHzAdBgNVBAMTFm90YWtpLmNsYXNzbWV0aG9kLmluZm8w ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDjgXgMRQHWiCfyrqUevab0 EkaACEzoeU6ZwY9Ig0XtlwP0nlaR16pYZIJd3M6aChC2G5e7QXSPys3N3LjVa6kP xyZEybj5CVUlsmFPcnHNk5EwAmKv1/A4i8iB/jrJzJjto3ca2iyy216BNagDoN/U /Wj6hgg4b6VabNC6fUeQkYHDfYxREwCPeU+pHMqJkkn++LN98HAlxQ2RariNyxrC RmjlOFBTxTUBBSn+0Xc4kZWcL8Dv40T56oLf0H1paXAEw/EF34YCUeiqivalqJWf gQ16/F/7eJj/qHuaBD5Hcy6Dlig3EUSC6hjEq+DR4j6Lx7xjHnIO2SmxL0R9oV5F AgMBAAGjggIWMIICEjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUH AwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFA/cU2NXbUVO+2uO 516O6qkx/5kkMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsG AQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNl bmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNl bmNyeXB0Lm9yZy8wIQYDVR0RBBowGIIWb3Rha2kuY2xhc3NtZXRob2QuaW5mbzCB /gYDVR0gBIH2MIHzMAgGBmeBDAECATCB5gYLKwYBBAGC3xMBAQEwgdYwJgYIKwYB BQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIGrBggrBgEFBQcCAjCB ngyBm1RoaXMgQ2VydGlmaWNhdGUgbWF5IG9ubHkgYmUgcmVsaWVkIHVwb24gYnkg UmVseWluZyBQYXJ0aWVzIGFuZCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUg Q2VydGlmaWNhdGUgUG9saWN5IGZvdW5kIGF0IGh0dHBzOi8vbGV0c2VuY3J5cHQu b3JnL3JlcG9zaXRvcnkvMA0GCSqGSIb3DQEBCwUAA4IBAQBzu3nwqLFj1b4enwWd /kg6qqWy/ymFQsdE18ICJnK0BPdux5XwRrKfofyrMYKw/MluyAMG0ANfDOIr1S49 w5nyCvexGRhM6eFCd5CZgAJI0HhjNUvlNjziwY/89iGY4C1poVUZ8vYwIuDZlA7P 6NHQuJwuL1plelm43fu6SmFZlWiYTT5hUWyXJyD4YKKO6ywnM76XTukZVhFNZ4uO EXb9wbRMvn9HKudEjO6uqOx5jwpXCDoAZPYZtnASkOJZxlVK+baDW71gt/0RIB43 +G+/WYlCgBdaZjpg90JVeOBchYszIwc3gavInayFkEv4rFaO+vayS7h4qCYYBbez UEhg -----END CERTIFICATE----- subject=/CN=otaki.classmethod.info issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 --- No client certificate CA names sent Peer signing digest: SHA512 Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 2005 bytes and written 297 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES128-GCM-SHA256 Session-ID: 4AFC8FDD699BF2E048AC803BFC7661F5165F7B85B4DF58C2C2D6F594888AA966 Session-ID-ctx: Master-Key: EB9399F7553A091CECCC8A87F344567F1D794D2923F20F83F8CBB472F172C574F26F04EBA6AEA9255A2F54F7D6C9B711 Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 43200 (seconds) TLS session ticket: 0000 - e9 ac 29 5b d9 9f d4 4c-d7 be 26 1f df 75 1a 95 ..)[...L..&..u.. 0010 - 76 ea 0c 45 99 c8 5e 41-2e 95 5a f2 cb 56 6f 82 v..E..^A..Z..Vo. 0020 - db d5 3d 81 ef 05 0c 17-d5 c5 5e 2a 6c c8 b5 2f ..=.......^*l../ 0030 - 32 17 65 92 3b 8b fa 8a-fe de 59 02 c0 ad fe eb 2.e.;.....Y..... 0040 - 41 b3 3a e8 6d bd 86 67-78 89 7e 15 27 39 7c ef A.:.m..gx.~.'9|. 0050 - e8 36 9c 4b 68 8e d0 5d-da 62 b1 2b 9d 30 0a 89 .6.Kh..].b.+.0.. 0060 - 8f f6 7b 90 33 1b 45 b9-ce 35 f5 67 20 95 5a 9b ..{.3.E..5.g .Z. 0070 - 90 e8 76 f3 3c 58 d9 20-c4 00 49 f8 6e fa 45 15 ..v.<X. ..I.n.E. 0080 - b5 e3 5b de 49 b2 de de-65 54 cb 8f 04 b7 d8 ec ..[.I...eT...... 0090 - 3c 74 e0 52 30 65 42 f7-e0 fb ba 54 7d 22 6a 49 <t.R0eB....T}"jI 00a0 - eb b1 f4 8b 2c 62 21 7b-2f 0f 72 b8 83 37 2e f5 ....,b!{/.r..7.. 00b0 - b6 29 3e b9 82 a4 40 48-44 8a 28 ee 1a 0e 98 de .)>...@HD.(..... 00c0 - 9f bd f7 53 62 96 af ad-0e f4 83 6d 12 0e 79 2b ...Sb......m..y+ Start Time: 1507852953 Timeout : 300 (sec) Verify return code: 21 (unable to verify the first certificate) --- DONE suzaku:~ ryuta$ openssl s_client -connect otaki.classmethod.info:443 -cipher ECDHE-ECDSA-AES128-GCM-SHA256 -servername otaki.classmethod.info < /dev/null CONNECTED(00000003) depth=0 CN = otaki.classmethod.info verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 CN = otaki.classmethod.info verify error:num=21:unable to verify the first certificate verify return:1 --- Certificate chain 0 s:/CN=otaki.classmethod.info i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 --- Server certificate -----BEGIN CERTIFICATE----- MIIEYTCCA0mgAwIBAgISBHiacePeRMlJokRddc7IFbC7MA0GCSqGSIb3DQEBCwUA MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzEwMTEwMjA4MTNaFw0x ODAxMDkwMjA4MTNaMCExHzAdBgNVBAMTFm90YWtpLmNsYXNzbWV0aG9kLmluZm8w djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQB8Is1yDpfnNYnW4mjTS7xKNTtqZLtVspV FXG74AfopDzyx6pkWZA7Dr69as4/EgXfsNYm8H+rYUzRGNxr+mezYXJ5hLjy0UAe JJBl+vhb3wv+j2IdZit+tqCOm/FSbx2jggIWMIICEjAOBgNVHQ8BAf8EBAMCB4Aw HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYD VR0OBBYEFOYqJ1dgo608ENp3kOOEGclNxuUzMB8GA1UdIwQYMBaAFKhKamMEfd26 5tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDov L29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDov L2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9yZy8wIQYDVR0RBBowGIIWb3Rha2ku Y2xhc3NtZXRob2QuaW5mbzCB/gYDVR0gBIH2MIHzMAgGBmeBDAECATCB5gYLKwYB BAGC3xMBAQEwgdYwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQu b3JnMIGrBggrBgEFBQcCAjCBngyBm1RoaXMgQ2VydGlmaWNhdGUgbWF5IG9ubHkg YmUgcmVsaWVkIHVwb24gYnkgUmVseWluZyBQYXJ0aWVzIGFuZCBvbmx5IGluIGFj Y29yZGFuY2Ugd2l0aCB0aGUgQ2VydGlmaWNhdGUgUG9saWN5IGZvdW5kIGF0IGh0 dHBzOi8vbGV0c2VuY3J5cHQub3JnL3JlcG9zaXRvcnkvMA0GCSqGSIb3DQEBCwUA A4IBAQBC4EyQQaBrvKEMt001dsj/OYNtah1hyDRRANIf0ydeJ5erk51KU1dAGL7E 96ziE5dF4EbIiIoASOkoiqk8FbuVtQs+SWMRh+ooCBFxUH2EPMyUqTvD1Gd1FaSX nbSbIT0mcYUtIp68S3NHl4LkmEQGCAeuXbaPQmrwp0bRgD9LNeJ00zNqC3PwuaBW CAYjbb6o0LYrkdwmQqIbiej7WiYmCDs396HJrOb3MnkhtOCue6w3ksHEukPGnzty xxNZDFltBTI9fi22yREtYQrj2jTh1ESuQi70EXSGcFSyVxWkama/sRI3zYVoHWTB C6lLASiechFzOjPe6aQmwgJCR8bs -----END CERTIFICATE----- subject=/CN=otaki.classmethod.info issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 --- No client certificate CA names sent Peer signing digest: SHA512 Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 1679 bytes and written 297 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-ECDSA-AES128-GCM-SHA256 Server public key is 384 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-ECDSA-AES128-GCM-SHA256 Session-ID: 8535C549C5BB67249BE71166FEF2FCC8DACCB02B88FD0B9F693E1B7301745C91 Session-ID-ctx: Master-Key: 27C093F11FC237EA0A1CB7C96DEE972077D2C7375A82047595A696791C1ACBF7C3077DFF3AD310CD6E7486E1DA61A27B Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 43200 (seconds) TLS session ticket: 0000 - e9 ac 29 5b d9 9f d4 4c-d7 be 26 1f df 75 1a 95 ..)[...L..&..u.. 0010 - ad ed 9b 5f 6a f2 d3 5a-98 7d 53 19 e7 7e 27 c4 ..._j..Z.}S..~'. 0020 - cc 58 bb 86 40 81 94 51-06 94 0b 36 04 61 f8 69 [email protected] 0030 - 8f 3e a0 40 ff 8b ef a1-19 47 fd 84 7e 29 26 4d .>[email protected]..~)&M 0040 - 5e f5 d7 b8 cc f6 b0 a8-85 1f f8 af 0e ec c7 1e ^............... 0050 - c0 8a 5e ea 55 d5 39 c1-4e 0a e2 48 ab 84 83 7a ..^.U.9.N..H...z 0060 - 48 d3 c2 bc b4 38 43 bb-9b 78 f9 f8 56 d4 f7 c1 H....8C..x..V... 0070 - 6d 81 b4 07 68 77 6d 30-57 e0 c6 30 06 f0 a7 42 m...hwm0W..0...B 0080 - 6e ed e2 c7 64 7f 17 1a-93 1a 79 03 a5 ff b5 f0 n...d.....y..... 0090 - 0f 01 81 06 56 17 0d f3-5b 1e c2 52 98 ff 84 47 ....V...[..R...G 00a0 - 55 54 74 e9 27 48 5e 49-1b ed 5b 8a fe 37 e1 c6 UTt.'H^I..[..7.. 00b0 - 2f 08 81 61 6e 54 04 f4-6d 53 3d 48 9c a7 52 48 /..anT..mS=H..RH 00c0 - 2e 9e 78 7d d2 89 cb 9d-32 7d 21 ff 26 9d bd 56 ..x}....2}!.&..V Start Time: 1507852956 Timeout : 300 (sec) Verify return code: 21 (unable to verify the first certificate) --- DONE
ECDSAをサポートするChromeブラウザでアクセスすると、ECDSAの証明書が選択されていることが確認できました。
まとめ
ALBの複数TLS証明書対応の応用編として、同一ドメインで異なる暗号方式の証明書を利用する様子をご紹介しました。 従来はTLS証明書が高額だったために、幅広いクライアントがサポートする枯れた暗号化方式の証明書のみを利用することが多かったと思います。しかしDV証明書であればACM(AWS Certificate Manager)やLet's Encryptを用いて複数の証明書を手軽に用意できるようになってきましたし、All HTTPSといったTLS通信の一般化も進んでいます *2ので、複数の暗号方式に合わせてそれぞれ証明書を配備することも増えていくのではないかと思います。
参考URL
- HTTPS Listeners for Your Application Load Balancer - Elastic Load Balancing
- サーバ負荷をRSAとECDSAで比較 - Apache 2.4系でHTTP/2対応サーバを構築してみるテスト。
- Testing out ECDSA certificates